package com.baizhi.stringx;

public class StringDemo {
    public static void main(String[] args) {

        //   str 是引用类型变量，简称引用
        // “abc” 是字面量对象
//        String str = "abc";
//        str = "abc123";

  //      System.out.println(str);

        // s1 s2 存储的是地址
        String s1 = "abc123";   //先检查字符串常量池，发现没有abc123这个对象，所以创建一个对象
        //当使用已有的字面量再次创建字符串时会重用常量池中那个字符串
        String s2 = "abc123";   //先检查字符串常量池，发现有abc123这个对象，复用
        // == 是等值比较
        System.out.println(s1 == s2); //true

        //s1 s2 s3 重用了同一个对象
        String s3 = "abc123"; //先检查字符串常量池，发现有abc123这个对象，复用
        System.out.println(s3 == s1);


        //创建字符串对象,虽然String提供了构造方法，但是推荐创建String对象的时候使用字面量直接赋值
        String s4 = new String("abc123");
        System.out.println(s4==s1); // false

        char[] arr = new char[6];
        arr[0] = 'a';
        arr[1] = 'b';
        arr[2] = 'c';
        arr[3] = '1';
        arr[4] = '2';
        arr[5] = '3';

        String s5 = new String(arr);
        System.out.println(s5);

        byte[] b = {97,98,99,46};
        String s6 = new String(b);
        System.out.println(s6);


        /*
         * 编译器有一个特性：
         * 当编译器在编译程序的时候如果遇到一个计算表达式且就散结果可以在编译期间确定时
         * ，编译器就会进行就散并且将结果编译到class文件中，编译后，下面代码字节码文件的样子为：
         * String s7 = “abc123”;
         */
        String s7 = "abc" + "123";
        System.out.println("s7="+s7);
        System.out.println("s1="+s1);
        System.out.println(s1 == s7); //true

        int a = 864000000; //1天多少毫秒
        int aa = 60 * 60 * 24 * 1000;  //1天有多少毫秒   .class文件中   int aa = 864000000

        String s = "abc";
        String s8 = s + "123"; //变量拼接会产生新的对象
        System.out.println("s8="+s8);
        System.out.println(s1 == s8); //false

        s1 = s1 + "!";
        System.out.println(s1 == s2); //false


        //经典面试题
       // String m = "a"; //创建了几个对象？ 1个

       // String m = new String("a");  //创建了几个对象？ 2个对象

        String m = "a";
        String m2 = new String("a"); //这两句话创建了几个对象？ 2个对象

    }
}
